package com.powernode.ssm.springAnalysis.a03;

import java.util.ArrayList;

/**
 * 模版方法解析：
 * 已有功能不变，固定部分抽象成接口
 */
public class TestMethodTemplate {

    public static void main(String[] args) {
        MyBeanFactory beanFactory = new MyBeanFactory();
        beanFactory.add(obj->System.out.println("解析@Autowired"));
        beanFactory.add(obj->System.out.println("解析@Resource"));
        beanFactory.getBean();
    }

    // 模板方法  Template Method Pattern
    static class MyBeanFactory {

        public Object getBean() {
            Object bean = new Object();
            System.out.println("构造 " + bean);
            System.out.println("依赖注入 " + bean); // @Autowired, @Resource
            /**
             * 需要在这里添加功能，其他功能已经固定
             * 变化的功能抽象成接口
             * 由于可能是多个功能，因此需要list来存储
             */
            for (MyBeanPostProfessor postProfessor : postProfessors) {
                postProfessor.inject(bean);
            }
            System.out.println("初始化 " + bean);
            return bean;
        }

        /**
         * 暴露给调用者的方法，需要传参
         * @param professor
         */
        public void add(MyBeanPostProfessor professor){
            postProfessors.add(professor);
        }

        /**
         * 定义一个list来存调用者的参数
         */
        private ArrayList<MyBeanPostProfessor> postProfessors = new ArrayList<>();
    }

    /**
     * 外部添加功能，肯定需要传参，同时不需要返回值
     */
    interface MyBeanPostProfessor{
        void inject(Object bean);
    }
}
